/**
 * 存储cookie
 * @param {string} key 要存储的cookie的名称
 * @param {string} value 要存储的cookie的值
 * @param {object} option 过期事件及路径
 */
const utils={
    setCookie(key,value,option){
        var str=`${key}=${encodeURIComponent(value)}`
    if(option){
        if(option.path){
            str+=`;path=${option.path}`;
        }
        if(option.expires){
            var date=new Date();
            date.setDate(date.getDate()+option.expires);
            str+=`;expires=${date.toUTCString()}`
        }
        
    }
    document.cookie=str;
    },
    /**
     * 
     * @param {string} key 要删除的键，删除的方法是将原来的cookie代替设置过去时间
     * @param {string} path 路径，删除cookie因为是代替原来的cookie，所以前后的路径必须相同
     */
    removeCookie(key,path){
        var str="";
        var date=new Date();
        date.setDate(date.getDate()-1);
        key=encodeURIComponent(key)
        str=`${key}='';expires=${date.toUTCString()}`;
        if(path){
            str+=`;path=${path}`;
        }
        document.cookie=str;
    },
    /**
     * 
     * @param {string} key 通过键来查找键值 
     */
    getCookie(key){
            var str=decodeURIComponent(document.cookie);
            var arr=str.split("; ");
            // alert(arr)//超级英雄=钢铁侠,2324神话=海王,神话=孙悟空
            var obj=new Object();
            arr.forEach(key => {
                var subArr=key.split("=");
                // alert(subArr[0])//获得键
                // alert(subArr[1])//获得值
                // alert(subArr)
                obj[subArr[0]]=subArr[1];
            });       
            return obj[key];
    },
    cookie(key,value,option){
        if(value || value === null){
            var str=`${key}=${encodeURIComponent(value)}`;
            if(option){
                if(option.path){
                   str+=`;path=${option.path}`
                }
                if(option.expires){
                    var date=new Date();
                    date.setDate(date.getDate()+option.expires)
                    str+=`;expires=${date.toUTCString()}`;
                }                
                document.cookie=str;
            }
        }else{
            var strCookie=document.cookie;
            var arr=strCookie.split("; ");
            var obj=new Object();
            arr.forEach(key=>{
                var strArr=key.split("=");
                obj[strArr[0]]=decodeURIComponent(strArr[1]);
            })
            return obj[key];
            }
        },
        /**
         * 发送ajax的get请求
         * @param {string } url 请求地址
         * @param {object} query 带入请求的键值对即参数
         * @param {function} cb 请求成功后的回调函数，获得到数据后运用数据要完成的内容
         * @param {Boolean} isJson 用于判断返回对象还是字符串，但一般是字符串，所以默认为true
         */
        get(url,query,cb,isJson=true){
            //  数据准备，拼接url
            // 判断url中是否传的有相应的值
            if(query){
                for (var key in query) {
                    url+=`${key}=${query[key]}&`;                    
                }
                // url=url.substring(0,url.length-1);
                str = str.slice(0, -1)
            }
            // 开始创建请求
            var xhr=new XMLHttpRequest();
            xhr.open("get",url);
            xhr.send();
            xhr.onreadystatechange=function(){
                if(xhr.readyState===4){
                    if(xhr.status==200){
                        // 判断从后台返回给HTML数据是json对象还是字符串，将接口数据作相应的转换
                        var data=isJson?JSON.parse(xhr.responseText):xhr.responseText;
                        // 将重后台得到的接口数据通过回调函数的方式传输给HTML，HTML设置有响应的变量来接收
                        cb&&cb(data);
                    }
                }
            }
        },
        post(url,query,cb,isJson=true){
            var str="";
            if(query){
                for(var key in query){
                  str +=`${key}=${query[key]}&`;
                }
                // str=str.substring(0,substring.length-1);
                str = str.slice(0, -1)
            }
            var xhr=new XMLHttpRequest();
            xhr.open("post",url);
            xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
            xhr.send(str);
            xhr.onreadystatechange=function(){
                if(xhr.readyState===4){
                    if(xhr.status===200){
                        var data=isJson?JSON.parse(xhr.responseText):xhr.responseText;
                        cb && cb(data);
                    }
                }
            }
        },
        /**
         * 发送jsonp请求  拼接script标签以及里面的url
         * @param {string} url 接口地址
         * @param {String} cbName 全局回调函数名
         * @param {object} query 请求所携带的其他参数 
         */
        jsonp(url,cbName,query){
            url+=`?cb=${cbName}`
            if(query){
               for(var i in query){
                   url+=`&${i}=${query[i]}`;
               }
            }
            var script=document.createElement("script");
            script.src=url;
            //因为script在发送请求以后就失效了，所以在添加后就删除，以免创建很多的script标签
            document.body.appendChild(script);
            document.body.removeChild(script);

        },
        /**
         * 返送基于promise的ajax请求
         * @param {strsing} url 请求地址
         * @param {object} query 携带的参数
         * @param {boolean} isJson 是否json序列化
         */
        fetch(url,query,isJson=true){
            if(query){
                url+=`?`;
                for(var item in query){
                    url+=`${item}=${query[item]}&`;
                }
                url=url.slice(0,-1);
            }
            return new Promise((resolve,reject)=>{
                var xhr=new XMLHttpRequest;
                xhr.open("get",url);
                xhr.send()
                xhr.onreadystatechange=function(){
                    if(xhr.readyState==4){
                        if(xhr.status==200){
                            var data=isJson?JSON.parse(xhr.response):xhr.responseText
                            resolve(data);
                        }else{
                            reject();
                    }
                    }
                }
            })
        }
}
